首页/MoonBit/5分钟看懂 MoonBit JSON

在 MoonBit 里,处理 JSON 最常用的是 moonbitlang/core/json
它主要解决两件事:

  • 把 MoonBit 数据变成 JSON
  • 把 JSON 变回 MoonBit 数据

最核心的几个关键词只有这几个:

  • Json
  • to_json()
  • @json.from_json(...)
  • derive(ToJson, FromJson)

先知道:JSON 在 MoonBit 里不是只能当字符串

很多初学者一想到 JSON,就会想到一大段字符串。

但在 MoonBit 里,更常见的做法是把它当成一个值类型:Json

比如:

let j : Json = {
  "name": "Alice",
  "age": 18
}

这就是一个 JSON 值,不是手搓字符串。

所以你可以把 Json 理解成:

“MoonBit 里专门表示 JSON 数据的类型”


最常见操作 1:直接写 JSON

当你想构造 JSON 数据时,写法很自然:

let user : Json = {
  "id": 1,
  "name": "Alice",
  "active": true
}

还可以嵌套:

let config : Json = {
  "app": "demo",
  "database": {
    "host": "127.0.0.1",
    "port": 5432
  }
}

这非常适合写测试数据,构造请求体,做 demo。


最常见操作 2:结构体转 JSON

如果你有一个 MoonBit 结构体,想把它转成 JSON,最常见写法是:

  1. 给类型加 derive(ToJson, FromJson)
  2. 调用 .to_json()
struct User {
  name : String
  age : Int
} derive(ToJson, FromJson, Eq)

let u = User::{ name: "Alice", age: 18 }
let j = u.to_json()

这时 j 就是一个 Json 值。

你可以把 to_json() 理解成:

“把 MoonBit 对象编码成 JSON”


最常见操作 3:JSON 转结构体

反过来,如果你有一段 JSON,想把它变成 MoonBit 类型,可以用:

@json.from_json(...)

例如:

struct User {
  name : String
  age : Int
} derive(ToJson, FromJson, Eq)

let j : Json = {
  "name": "Alice",
  "age": 18
}

let u : User = @json.from_json(j)

这时 u 就是强类型的 User

你可以把它理解成:

“把 JSON 解析成 MoonBit 对象”


最推荐的使用方式

实际写项目时,推荐你这样理解:

输入 JSON

转成 MoonBit 类型

写业务逻辑

再转回 JSON

也就是边界层用 JSON,业务层用强类型,这样代码会更清楚,也更不容易出错。


一个最小完整例子

import {
  "moonbitlang/core/json" @json,
}

struct User {
  user_id : Int
  name : String
} derive(
  FromJson(fields(user_id(rename="userId"))),
  ToJson(fields(user_id(rename="userId"))),
  Eq
)

fn main {
  let input : Json = {
    "userId": 1,
    "name": "Alice"
  }

  let user : User = @json.from_json(input)
  let output : Json = user.to_json()

  ignore(output)
}

这个例子展示了 MoonBit JSON 最核心的 3 步:

  • Json
  • from_json
  • to_json

为什么有 rename

因为代码里的字段名和 JSON 里的字段名可能不一样。

比如:

  • MoonBit 里喜欢写:user_id
  • JSON 里常见写法:userId

所以可以这样写:

fields(user_id(rename="userId"))

这表示:

  • MoonBit 字段叫 user_id
  • JSON 字段叫 userId

这样就能同时兼顾两边的命名风格。


你现在只需要记住这 4 件事

Json

表示 JSON 数据本身。

derive(ToJson, FromJson)

让类型自动支持 JSON 编解码。

value.to_json()

把对象转成 JSON。

@json.from_json(...)

把 JSON 转成对象。

先把 JSON 收进来,转成类型处理,最后再转回 JSON。


总结

MoonBit 的 JSON 处理思路其实很清晰:

  • Json:表示 JSON 数据
  • to_json():对象转 JSON
  • @json.from_json(...):JSON 转对象
  • derive(ToJson, FromJson):自动生成编解码能力

如果你只学入门,先把这条主线掌握就够了。